<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 1. 构造函数Array的方法
    // Array.from()   ES6
    // Array.isArray()  
    // Array.of() 方法用于将一组值，转换为数组。

    // var arr = Array.of(1, 4, 7);  // new Array(1,4,7)
    // console.log(arr);


    // var arr = new Array(10);  // 长度为10的数组   [,,,,,,,,,]
    // console.log(arr); 

    // var arr = Array.of(10);  // new Array(1,4,7)
    // console.log(arr);



    // 数组的拓展方法
    // findLast()  查找满足条件的最后一个元素(倒着找)
    // findLastIndex()  查找满足条件的最后一个元素的下标(倒着找)

    // var arr = [1, 4, 7, 2, 5, 8, 7, 4, 1];

    // var result = arr.findLast(function(item){
    //     return item % 2 == 0;
    // })
    // console.log(result);

    // var result = arr.findLastIndex(function(item){
    //     return item % 2 == 0;
    // })
    // console.log(result);


    // fill(value)  使用给定值，填充一个数组。
    // 返回值: 填充后的原数组
    // 是否影响原数组: 影响

    // var arr = [1, 4, 7, 2, 5, 8, 7, 4, 1];  // 批量修改
    // arr.fill(null);
    // console.log(arr);

    // var list = new Array(10).fill(true);  // 批量赋值
    // console.log(list);

    // fill(value,startIndex = 0,endIndex = 数组.length)方法还可以接受第二个和第三个参数，用于指定填充的起始位置和结束位置。
    // var arr = [1, 4, 7, 2, 5, 8, 7, 4, 1]; 
    // var result = arr.fill(null,1, 5);
    // console.log(result);
    // console.log(arr);
    // console.log(arr === result);


    // includes(value,startIndex)    判断数组中是否存在某个元素
    // 注意: 
    // includes() 也可接收第二参数作为查询的起始下标
    // includes() 可以判断数组中是否包含NaN
    // var  arr = [1, 4, 7, 2, 5, 8, 7, 4, 1,NaN];
    // console.log(arr.includes(4)); 
    // console.log(arr.includes(4,2)); 
    // console.log(arr.includes(4,8)); 

    // console.log(arr.indexOf(NaN));  // indexOf 不能判断包含NaN
    // console.log(arr.includes(NaN));  // includes可以判断数组中是否包含NaN



    // flat()   用于将嵌套的数组“拉平”，变成一维的数组。该方法返回一个新数组，对原数据没有影响。
    // 注意: 
    // flat()默认只会“拉平”一层，如果想要“拉平”多层的嵌套数组，可以将flat()方法的参数写成一个整数，表示想要拉平的层数，默认为1  (n维数组  => n-1)
    // 如果不管有多少层嵌套，都要转成一维数组，可以用Infinity关键字作为参数

    var arr = [1, 4, 7, [2, 5, 8]];  // [1, 4, 7, 2, 5, 8]
    // var newArr = arr.flat(); 
    // console.log(newArr);  
    
    
    var arr = [1, 4, 7, [2, 5, 8, [3, 6, 9]]];
    var newArr = arr.flat(2); 
    console.log(newArr);  


    var arr = [1, 4, 7, [2, 5, 8, [3, 6, 9,[1,4,7,[2,[5,[8,[3,[6,[9]]]]]]]]]];
    var newArr = arr.flat(Infinity); 
    console.log(newArr);  
    



    // function deepFlat(list) {
    //     var arr = [];
    //     for (var i = 0; i < list.length; i++) {
    //         var item = list[i];
    //         if (!Array.isArray(item)) { //不是数组
    //             arr.push(item);
    //         } else {
    //             var copyArr = deepFlat(item);
    //             // arr.push(copyArr);
    //             arr = arr.concat(copyArr);
    //         }
    //     }
    //     return arr;
    // }

    // console.log(deepFlat(arr));



    // flatMap()   简单来说 map和flat的组合版  => 先根据原数组生成新数组,在将新数组拉平
    // 注意: flatMap()只能展开一层数组。

    var arr = [2,3,6];
    // arr = arr.map(function(item){
    //     return [item,item * 2];
    // })
    // console.log(arr);

    // arr = arr.flat();
    // console.log(arr);

    var result = arr.flatMap(function(item){
        return [item,item * 2];
    })
    console.log(result);









</script>

</html>